CloudWatch Alarmでメール通知する際に一緒にグラフ画像を添付してみた
はじめに
おはようございます、加藤です。 先日、24日にCloudWatchに画像(スナップショット)を取得する機能がリリースされました。これによってCloudWatch Eventでアラートを通知した際に、一緒に画像を添付することができます。アラートを受け取った際にCloudWatchの画面を開かなくても、発生前までの傾向を瞬時に捉えることができるようになりました。
Amazon CloudWatch に、AWS コンソール以外でカスタムダッシュボードを作成できる機能が追加されました。
やってみた
Reduce Time to Resolution with Amazon CloudWatch Snapshot Graphs and Alerts | AWS DevOps Blog 上記のブログを参考に実装してみます。
今回はSESを使用しサンプルコードをそのまま使用します。 そのためSESが存在するリージョンの方が都合良いので、オレゴン(us-west-2)リージョンをで構築します。
EC2インスタンスの作成
以下のスペックでEC2インスタンスを用意します。
OS | インスタンスタイプ | IAMロール |
---|---|---|
Amazon Linux2 | t3.nano | cloudwatch-snapshot-graph |
SSMのロールは検証の為の操作を行う為に付与しています。必須ではありません。
Lambda関数の作成
IAMロールの作成
- CloudWatchReadOnlyAccess
- AmazonSESFullAccess
- AmazonSNSReadOnlyAccess
上記のポリシーがアタッチされたIAMロールを作成します。ロール名は lambda_cloudwatch_snapshot_graph としました。
関数の作成
Lamba関数を作成します。
名前 | ランタイム | ロール |
---|---|---|
snapShotAlarmDemo | Node.js 6.10 | lambda_cloudwatch_snapshot_graph |
Githubからサンプルコードをクローンし、npm installしてからZIPを作成します。
git clone https://github.com/aws-samples/aws-cloudwatch-snapshot-graphs-alert-context cd aws-cloudwatch-snapshot-graphs-alert-context/ npm install zip -r snapshotgraphsalarmdemo.zip ./*
作成したZIPをアップロードし、タイムアウトを30秒に変更して保存します。
ハンドラ |
---|
emailer.myHandler |
環境変数を設定します。
Key | Value | Comment |
---|---|---|
EMAIL_TO_ADDRESS | to_mail_address | 送信先メールアドレス |
EMAIL_FROM_ADDRESS | from_mail_address | 送信元メールアドレス |
SNSトピックを作成する
トピックを作成します。
トピック名 | 表示名 |
---|---|
snapShotAlarmDemo | D_ssAlarm |
サブスクリプションを作成します。
トピックARN | プロトコル | エンドポイント | バージョンまたはエイリアス |
---|---|---|---|
arn:aws:sns:us-west-2:アカウント番号:snapShotAlarmDemo | AWS Lambda | arn:aws:lambda:us-west-2:アカウント番号:function:snapShotAlarmDemo |
SESの設定
SESに送信元メールアドレスを登録(所有証明)します。
下記タイトルのメールが届くのでリンクをクリックして承認します。
Amazon Web Services – Email Address Verification Request in region US West (Oregon)
承認後はステータスがverifiedに変化します。
CloudWatch Alarmの作成
CloudWatch Alarmを作成します。
CPUUtilizationを対象に作成します。
動作テスト
Alarmのしきい値を>=0に変更して強制的に通知を飛ばしてみます。
無事にグラフ付きでメールが届きました!
あとがき
参考元の写経ですが、通知に画像を追加することができました。 これを参考にすれば、Lambda関数を変更すればSlackやChatworkへ通知を行うことができそうですね! 既にLambda関数を使って通知を行っている方にはGithubに上がっているサンプルコードを参考にすれば簡単だと思うので是非試して見てくださいー 私もそのうち書こうと思います!